package util;



public enum WindRichting {
	NOORD(new Coordinaat(0,1)),
	OOST(new Coordinaat(1,0)),
	ZUID(new Coordinaat(0,-1)),
	WEST(new Coordinaat(-1,0));
	
	WindRichting(Coordinaat vector) {
		this.vector = vector;
	}
	
	public Coordinaat getVector() {
		return vector;
	}
	
	public WindRichting getTegengesteld() {
		int ordinal = (this.ordinal() + 2) % WindRichting.values().length;
		return values()[ordinal];
	}
	
	/**
	 * 
	 * @param richting
	 * @return
	 * 
	 * @throws	IllegalArgumentException
	 * 			richting == null
	 */
	public WindRichting getOrientatieInRichting(Richting richting) {
		if(richting == null)
			throw new IllegalArgumentException();
		
		int ordinal = this.ordinal();
		
		if(richting.isVooruitOfAchteruit())
			ordinal += 1;
		
		ordinal += richting.getIntAlsRechtsOfAchteruitPositief(1);
		ordinal = (ordinal + WindRichting.values().length ) % WindRichting.values().length;
			
		return WindRichting.values()[ordinal];
	}
	
	/**
	 * Geeft de richting terug waarin de andere orientatie ligt.
	 * 
	 * @param	andereOrientatie
	 * @return
	 */
	public Richting richtingVanOrientatie(WindRichting andereOrientatie) {
		if(andereOrientatie == null)
			throw new NullPointerException();
		
		int thisOrdinal = this.ordinal();
		int andereOrdinal = andereOrientatie.ordinal();
		
		if(thisOrdinal == andereOrdinal)
			return Richting.VOOR;
		
		int verschil = thisOrdinal - andereOrdinal;
		
		if(verschil == -1 || verschil == 3)
		{
			return Richting.RECHTS;
		}
		
		if(verschil == 2 || verschil == -2)
		{
			return Richting.ACHTER;
		}
		
		if(verschil == 1 || verschil == -3)
		{
			return Richting.LINKS;
		}
		
		throw new RuntimeException();
	}
	
	private Coordinaat vector;
}